home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Ken Long / SimpleWarp-c / Think & more / Warp.c next >
Encoding:
C/C++ Source or Header  |  1994-12-04  |  4.5 KB  |  258 lines  |  [TEXT/KAHL]

  1. #include <math.h>
  2. #include "Warp.h"
  3.  
  4. #define kNumOfStars            70
  5. #define kProjDistance        450
  6. #define kLargeStar            0
  7. #define kSmallStar            1
  8.  
  9. Star        gStarField [kNumOfStars];
  10. short        gVelocity;
  11. Point        gOrigin;
  12. RgnHandle    gOldGrayRgn;
  13. short        gOldMBarHeight;
  14. WindowPtr    gWindow;
  15. short         hPos, vPos;
  16. Point         mouseLoc, oldmouseLoc;
  17. Boolean        continues;
  18. EventRecord    theEvent;
  19.  
  20. void DoKeyDown (EventRecord *theEvent);
  21.  
  22. void main (void)
  23. {
  24.     short    loop;
  25.     
  26.     InitToolbox ();
  27.     InitStarField ();
  28.     HideCursor ();
  29.     MainEvent ();    
  30.     ShowCursor ();
  31. }
  32.  
  33. void InitToolbox (void)
  34. {
  35.     EventRecord        event;
  36.     short            count;
  37.     Rect            mBarRect;
  38.     RgnHandle        mBarRgn;
  39.     
  40.     InitGraf ((Ptr) &qd.thePort);
  41.     InitFonts ();
  42.     InitWindows ();
  43.     InitMenus ();
  44.     TEInit ();
  45.     InitDialogs (nil);
  46.     InitCursor ();
  47.     
  48.     for (count = 1; count <= 3; ++count)
  49.         EventAvail (everyEvent, &event);
  50.     
  51.     gOldMBarHeight = GetMBarHeight ();
  52.     GetMBarHeight () = 0;
  53.     gWindow = NewWindow (nil, &screenBits.bounds, "\p", true, plainDBox, (WindowPtr) - 1,
  54.         false, 0);
  55.     SetRect (&mBarRect, screenBits.bounds.left, screenBits.bounds.top,
  56.         screenBits.bounds.right, screenBits.bounds.top + gOldMBarHeight);
  57.     mBarRgn = NewRgn ();
  58.     RectRgn (mBarRgn, &mBarRect);
  59.     UnionRgn (gWindow->visRgn, mBarRgn, gWindow->visRgn);
  60.     DisposeRgn (mBarRgn);
  61.     SetPort (gWindow);
  62.     FillRect (&gWindow->portRect, black);
  63.     
  64.     GetDateTime (&qd.randSeed);
  65. }
  66.  
  67. void InitStarField (void)
  68. {
  69.     short loop;
  70.     
  71.     gVelocity = 10;
  72.     gOrigin.h = (screenBits.bounds.right - screenBits.bounds.left) / 2;
  73.     gOrigin.v = (screenBits.bounds.bottom - screenBits.bounds.top) / 2;
  74.     
  75.     for (loop = 0; loop < kNumOfStars; loop++) 
  76.     {
  77.         CreateStar (&gStarField [loop]);    
  78.     }
  79. }
  80.  
  81. MainEvent ()
  82. {
  83.     Point    temp;
  84.  
  85.     SetEventMask (mDownMask + keyDownMask + autoKeyMask);
  86.     GetMouse (&oldmouseLoc);
  87.     while (!Button ()) 
  88.     {
  89.         AnimateStarField ();
  90.         if (GetNextEvent (everyEvent, &theEvent))
  91.             switch (theEvent.what)
  92.             {
  93.                 case mouseDown: 
  94. //                    DoMouseDown ();
  95.                 break;
  96.                 
  97.                 case keyDown: 
  98.                 case autoKey: 
  99.                     DoKeyDown (&theEvent);
  100.                 break;
  101.                 
  102.                 default:
  103.                 break;
  104.             }
  105.             //• Moves the direction indicators.
  106.             GetMouse (&mouseLoc);
  107.             if (! EqualPt (mouseLoc, oldmouseLoc))
  108.             {
  109.                 temp.h = temp.v + (mouseLoc.h - oldmouseLoc.h);
  110.                 temp.v = temp.v + (mouseLoc.v - oldmouseLoc.v);
  111.                 oldmouseLoc = mouseLoc;
  112.             }
  113.     }
  114. }
  115.  
  116. void AnimateStarField (void)
  117. {
  118.     short    loop;
  119.     Point    location;
  120.     
  121.     for (loop = 0; loop < kNumOfStars; loop++) 
  122.     {
  123.         location = Project (gStarField [loop]);
  124.         ForeColor (blackColor);
  125.         if (gStarField [loop].size == kLargeStar)
  126.             DrawLargeStar (location);
  127.         else
  128.             DrawSmallStar (location);
  129.         
  130.         AnimateStar (&gStarField [loop]);
  131.         location = Project (gStarField [loop]);
  132.         ForeColor (whiteColor);
  133.         if (gStarField [loop].size == kLargeStar)
  134.             DrawLargeStar (location);
  135.         else
  136.             DrawSmallStar (location);
  137.     }
  138. }
  139.  
  140. void DrawLargeStar (Point aPt)
  141. {
  142.     Rect    temp;
  143.     
  144.     temp.left = aPt.h - 1;
  145.     temp.right = aPt.h + 1;
  146.     temp.top = aPt.v - 1;
  147.     temp.bottom = aPt.v + 1;
  148.     
  149.     PaintRect (&temp);
  150. }
  151.  
  152. void DrawSmallStar (Point aPt)
  153. {
  154.     MoveTo (aPt.h, aPt.v);
  155.     LineTo (aPt.h, aPt.v);
  156. }
  157.  
  158. Point Project (Star aStar)
  159. {
  160.     Point    temp;
  161.     
  162.     temp.h = aStar.x * kProjDistance / aStar.z + gOrigin.h;
  163.     temp.v = aStar.y * kProjDistance / aStar.z + gOrigin.v;
  164.     
  165.     return temp;
  166. }
  167.  
  168. void DoKeyDown (EventRecord *theEvent)
  169. {
  170.     short    chCode;
  171.     chCode = theEvent->message & charCodeMask;
  172.     
  173.     switch (chCode) 
  174.     {
  175.         case '+':
  176.             gVelocity = gVelocity + 0.1;
  177.         break;
  178.         
  179.         case '-':
  180.             gVelocity = gVelocity - 0.1;
  181.         break;
  182.         
  183.         case 'q':
  184.         case 'Q':
  185. //            continues = false;
  186.         break;
  187.         
  188.         case '0':
  189. //            DoMouseDown ();
  190.         break;
  191.         
  192.         case '4':
  193.             hPos = hPos - 5;
  194.         break;
  195.         
  196.         case '6':
  197.             hPos = hPos + 5;
  198.         break;
  199.         
  200.         case '8':
  201.             vPos = vPos + 5;
  202.         break;
  203.  
  204.         case '5':
  205.             vPos = vPos - 5;
  206.         break;
  207.         
  208.         case '1':
  209.         {
  210.             vPos = 0;
  211.             hPos = 0;
  212.         }
  213.         break;
  214.     }
  215. }
  216.  
  217. void AnimateStar (Star *aStar)
  218. {
  219.     aStar->z = aStar->z - gVelocity;
  220.     if (aStar->z <= 0)
  221.         CreateStar (aStar);
  222.     
  223. //     /* aStar->x = aStar->x - 0;
  224. //     if (aStar->x <= 0)
  225. //         CreateStar (aStar);
  226. //     
  227. //     aStar->y = aStar->y - 0;
  228. //     if (aStar->y <= 0)
  229. //         CreateStar (aStar); */
  230. }
  231.  
  232. void CreateStar (Star *aStar)
  233. {
  234.     aStar->x = GetRandom (0, gOrigin.h);
  235.     if (GetRandom (0, 1) == 0)
  236.         aStar->x = - aStar->x;
  237.         
  238.     aStar->y = GetRandom (0, gOrigin.v);
  239.     if (GetRandom (0, 1) == 0)
  240.         aStar->y = - aStar->y;
  241.     
  242.     aStar->z = GetRandom (0, 150) + 125;
  243.     
  244.     aStar->size = GetRandom (0, 1);
  245. }
  246.  
  247. unsigned short GetRandom(unsigned short min, unsigned short max)
  248. {
  249.     unsigned short random;
  250.     long range, temp;
  251.  
  252.     random = Random();
  253.     range = (max - min) + 1;
  254.     temp = (random * range) / 65536;
  255.     random = temp + min;
  256.  
  257.     return random;
  258. }